package com.cui.project.manager;


import com.api.common.common.ErrorCode;
import com.cui.project.exception.BusinessException;
import org.redisson.api.*;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.format.DateTimeFormatter;

/**
 * 专门提供 RedisLimiter 限流基础服务的（提供了通用的能力）
 */
@Service
public class RedisLimiterManager {

    @Resource
    private RedissonClient redissonClient;

    /**
     *
     * @param key 区分不同的限流器，比如不同的用户 id 应该分别统计
     * @param number 次数
     * @param time 时间
     */
    public void doRateLimit(String key,long number,long time,RateIntervalUnit unit,long token) {
        // 创建一个名称为user_limiter的限流器
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        /**
         * 参数2：次数
         * 参数3: 时间
         * 参数4: 时间格式
         * 如每个时间间隔最多允许 2 个请求。 这边是1秒内只能请求2次
         * rateLimiter.tryAcquire(1); 一个请求可以获取1个令牌
         */
        rateLimiter.trySetRate(RateType.OVERALL, number, time, unit);
        // 每当一个操作来了后，请求一个令牌
        //todo 这边可以扩展，普通用户每秒可以获取2次，会员可以5次
        boolean canOp = rateLimiter.tryAcquire(token);
        long expireTime = rateLimiter.getExpireTime();
        if(!canOp){
            RateLimiterConfig config = rateLimiter.getConfig();
            throw  new BusinessException(ErrorCode.TOO_MANY_REQUEST,(expireTime / 3600)+"个小时后再次尝试请求");
        }
    }
}
